home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Screenblankers / GBlanker Modules / NoGBlankers / Blankers / Pendulum / blank.c next >
C/C++ Source or Header  |  1996-09-26  |  5KB  |  213 lines

  1. /*
  2.  *  Copyright (c) 1995 Andreas Schmitz
  3.  *  All rights reserved.
  4.  *
  5.  *  This is a blanker-module for Garshne-Blanker 3.6
  6.  *
  7.  *  Pendulum 38.1
  8.  *
  9.  */
  10.  
  11. #include <exec/memory.h>
  12. #include <stdio.h>
  13. #include <math.h>
  14. #include <time.h>
  15. #include <float.h>
  16. #include <stdlib.h>
  17.  
  18. #include "/includes.h"
  19.  
  20. #define MASS   0
  21. #define MUSER  2
  22. #define LENGTH 4
  23. #define LUSER  6
  24. #define COLMODE   8
  25. #define SCRMODE 10
  26.  
  27. Triplet *ColorTable = 0L;
  28.  
  29. #include "Pendulum_rev.h"
  30. STATIC const UBYTE VersTag[] = VERSTAG;
  31.  
  32. VOID Defaults( PrefObject *Prefs )
  33. {
  34.     Prefs[MASS].po_Level = 50;
  35.    Prefs[MUSER].po_Active = 1;
  36.     Prefs[LENGTH].po_Level = 50;
  37.    Prefs[LUSER].po_Active = 1;
  38.    Prefs[COLMODE].po_Active = 0;
  39.     Prefs[SCRMODE].po_Depth = 4;
  40. }
  41.  
  42.  
  43. LONG Pendel( struct Screen *Scr, SHORT Wid, SHORT Hei, PrefObject *Prefs)
  44. {
  45.     struct RastPort *RP = &( Scr->RastPort );
  46.  
  47.    int   x1,y1,x2,y2,midx,midy,
  48.          colmodus,totlong,colors;
  49.  
  50.    int back,zeit,count=0;
  51.  
  52.    double phi1,omega1,beschl1,
  53.           phi2,omega2,beschl2,
  54.           dphi,sindp,cosdp,det,Bee,iXs,Yps,
  55.           dt,Energie,
  56.           m2,l1,l2,
  57.           gxl1,l1xl1,l1xl2,m2xl2,m2xgxl2,m2xl1xl2,m2xl2xl2,
  58.           faktor,g=9.81;
  59.  
  60.    srand((unsigned)clock());
  61.  
  62.    colmodus=Prefs[COLMODE].po_Active;
  63.  
  64.    midx=Wid/2;
  65.    midy=Hei/2;
  66.    totlong=midy-2;
  67.    if (midx<midy) totlong=midx-2;
  68.  
  69.    if (Prefs[MUSER].po_Active==0) {
  70.       m2=0.01+rand()*0.98/RAND_MAX;
  71.    }
  72.    else {
  73.       m2=1.0-0.01*Prefs[MASS].po_Level;
  74.    }
  75.    if (Prefs[LUSER].po_Active==0) {
  76.       l1=0.01+rand()*0.98/RAND_MAX;
  77.    }
  78.    else {
  79.        l1=0.01*Prefs[LENGTH].po_Level;
  80.    }
  81.    l2=1.0-l1;
  82.    gxl1=g*l1;
  83.    l1xl1=l1*l1;
  84.    l1xl2=l1-l1xl1;
  85.    m2xl2=m2*l2;
  86.    m2xgxl2=m2xl2*g;
  87.    m2xl1xl2=m2*l1xl2;
  88.    m2xl2xl2=m2xl2*l2;
  89.  
  90.    dt=0.001;
  91.    if (colmodus==0) dt=0.01;
  92.  
  93.    phi1=rand()*M_PI/RAND_MAX;
  94.    omega1=3.0-rand()*6.0/RAND_MAX;
  95.    phi2=rand()*M_PI/RAND_MAX;
  96.    omega2=3.0-rand()*6.0/RAND_MAX;
  97.  
  98.    Energie=0.5*(l1xl1*omega1*omega1+m2xl2xl2*omega2*omega2)+m2xl1xl2*omega1*omega2*cos(phi1-phi2)-gxl1*cos(phi1)-m2xgxl2*cos(phi2);
  99.     
  100.     SetRast( RP, 0 );
  101.     ScreenToFront( Scr );
  102.     
  103.    colors = (1L << RP->BitMap->Depth)-1;
  104.  
  105.    zeit=clock();         
  106.  
  107.     while (1) {
  108.  
  109.       x1=midx+totlong*(l1*sin(phi1));
  110.       y1=midy+totlong*(l1*cos(phi1));
  111.       x2=midx+totlong*(l1*sin(phi1)+l2*sin(phi2));
  112.       y2=midy+totlong*(l1*cos(phi1)+l2*cos(phi2));
  113.  
  114.       Move(RP,midx,midy);
  115.       if (colmodus==2) {
  116.          SetAPen(RP,1+count%colors);
  117.          Draw(RP,x1,y1);
  118.          SetAPen(RP,1+(colors/2+count%colors)%colors);
  119.       }
  120.       else {
  121.          SetAPen(RP,1);
  122.          Draw(RP,x1,y1);
  123.          SetAPen(RP,2);
  124.       }
  125.       Draw(RP,x2,y2);
  126.  
  127.       dphi=phi1-phi2;
  128.       sindp=sin(dphi);
  129.       cosdp=cos(dphi);
  130.       det=m2*cosdp*cosdp-1.0;
  131.       Bee=cosdp/(l1xl2*det);
  132.       iXs=-gxl1*sin(phi1)-m2xl1xl2*omega2*omega2*sindp;
  133.       Yps=-m2xgxl2*sin(phi2)+m2xl1xl2*omega1*omega1*sindp;
  134.  
  135.       beschl1=Bee*Yps-iXs/(l1xl1*det);
  136.       beschl2=Bee*iXs-Yps/(m2xl2xl2*det);
  137.       omega1=omega1+beschl1*dt;
  138.       omega2=omega2+beschl2*dt;
  139.       phi1=phi1+omega1*dt;
  140.       phi2=phi2+omega2*dt;
  141.  
  142.       if (fabs(phi1)>1000000.0) phi1=0.0;
  143.       if (fabs(phi2)>1000000.0) phi2=0.0;
  144.  
  145.       /*
  146.       Energie-Korrektur
  147.       */
  148.       faktor=sqrt((Energie+gxl1*cos(phi1)+m2xgxl2*cos(phi2))/(0.5*(l1xl1*omega1*omega1+m2xl2xl2*omega2*omega2)+m2xl1xl2*omega1*omega2*cos(phi1-phi2)));
  149.       omega1=omega1*faktor;
  150.       omega2=omega2*faktor;
  151.  
  152.       count++;
  153.        if (count%20==0) {
  154.          back=ContinueBlanking();
  155.          if (back!=OK) return(back);
  156.            ScreenToFront( Scr );
  157.          if (colmodus!=0) {
  158.             if (clock()>zeit+120*CLK_TCK) return(OK);
  159.          }
  160.        }
  161.     
  162.       if (colmodus==0) {
  163.          Move(RP,midx,midy);
  164.          SetAPen(RP,0);
  165.          WaitTOF();
  166.          Draw(RP,x1,y1);
  167.          Draw(RP,x2,y2);
  168.       }
  169.     }
  170.  
  171.     return 0;
  172. }
  173.  
  174. LONG Blank( PrefObject *Prefs )
  175. {
  176.     struct Screen *Scr;
  177.     struct Window *Wnd;
  178.     LONG RetVal;
  179.    char depth;
  180.     
  181.    depth=2;
  182.    if (Prefs[COLMODE].po_Active == 2) {
  183.       depth=Prefs[SCRMODE].po_Depth;
  184.       if (depth==1) depth=2;
  185.    }
  186.  
  187.     if( Scr = OpenScreenTags( NULL, SA_Depth, depth,
  188.                              SA_Quiet, TRUE, SA_DisplayID, Prefs[SCRMODE].po_ModeID,
  189.                              SA_Behind, TRUE, SA_Overscan, OSCAN_STANDARD,
  190.                              TAG_DONE ))
  191.     {
  192.         SetRGB4(&( Scr->ViewPort ), 0, 0, 0, 0 );
  193.         ColorTable = RainbowPalette( Scr, 0L, 1L, 0L );
  194.       if (Prefs[COLMODE].po_Active != 2) {
  195.            SetRGB4(&( Scr->ViewPort ), 1, 15, 15, 15 );
  196.            SetRGB4(&( Scr->ViewPort ), 2, 15, 0, 0 );
  197.       }
  198.         Wnd = BlankMousePointer( Scr );
  199.         
  200.         do
  201.             RetVal = Pendel( Scr, Scr->Width, Scr->Height, Prefs);
  202.         while( RetVal == OK );
  203.         
  204.         UnblankMousePointer( Wnd );
  205.         RainbowPalette( 0L, ColorTable, 1L, 0L );
  206.         CloseScreen( Scr );
  207.     }
  208.     else
  209.         RetVal = FAILED;
  210.     
  211.     return RetVal;
  212. }
  213.